package org.xy.netty.server.Handler;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * 第一道工序
 * @author xiaoy
 */
public class GroupChatServerHandler extends SimpleChannelInboundHandler<String> {
    // 自己管理很麻烦
    //public static List<Channel> channels = new ArrayList<Channel>();

    //使用一个hashmap 管理，可以使用用户id获取用户
    public static Map<String, Channel> channels = new HashMap<String,Channel>();

    //定义一个channle 组，管理所有的channel
    //GlobalEventExecutor.INSTANCE) 是全局的事件执行器，是一个单例
    //private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


    //handlerAdded 表示连接建立，一旦连接，第一个被执行
    //将当前channel 加入到  channelGroup
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();


        channel.writeAndFlush("[客户端]" + channel.remoteAddress() + " 加入聊天" + sdf.format(new java.util.Date()) + " \n");
        System.out.println(channel.id().asLongText()+"加入");
        channels.put(channel.id().asLongText(),channel);
    }

    //断开连接, 将xx客户离开信息推送给当前在线的客户，该方法会自动将channel从channelGroup删除
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {

        String channelId = ctx.channel().id().asLongText();
        System.out.println(channelId+"离开");
        channels.remove(channelId);


    }

    //表示channel 处于活动状态, 提示 xx上线
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        String channelId = ctx.channel().id().asLongText();
        System.out.println(channelId+"上线");
    }

    //表示channel 处于不活动状态, 提示 xx离线了
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {

        String channelId = ctx.channel().id().asLongText();
        System.out.println(channelId+"离线");
    }

    //读取数据
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        System.out.println("读取到客户端消息:"+msg);
        String tagMsg="我接收到客户端发的消息了，我现在回复你，你的消息是："+msg;
        //将客户端发送的消息，写回到客户端
        ByteBuf byteBuf = Unpooled.buffer(tagMsg.length());
        byteBuf.writeBytes(tagMsg.getBytes());
        ctx.writeAndFlush(byteBuf);

    }

    // 发生异常
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //关闭通道
        ctx.close();
    }
}
